}
#endif //VTLB_DEBUG
pte &= ~PAGE_FLAGS_RV_MASK;
- thash_purge_and_insert(vcpu, pte, itir, ifa);
+ thash_purge_and_insert(vcpu, pte, itir, ifa, ISIDE_TLB);
return IA64_NO_FAULT;
}
gpfn = (pte & _PAGE_PPN_MASK)>> PAGE_SHIFT;
if (VMX_DOMAIN(vcpu) && __gpfn_is_io(vcpu->domain, gpfn))
pte |= VTLB_PTE_IO;
- thash_purge_and_insert(vcpu, pte, itir, ifa);
+ thash_purge_and_insert(vcpu, pte, itir, ifa, DSIDE_TLB);
return IA64_NO_FAULT;
}
((pteval & _PAGE_MA_MASK) != _PAGE_MA_ST)) {
vcpu_get_rr(v, vadr, &rr);
itir = rr&(RR_RID_MASK | RR_PS_MASK);
- thash_purge_and_insert(v, pteval, itir , vadr);
+ thash_purge_and_insert(v, pteval, itir, vadr, DSIDE_TLB);
return IA64_NO_FAULT;
}
if(vpsr.ic){
if (pteval & _PAGE_P){
vcpu_get_rr(v, vadr, &rr);
itir = rr&(RR_RID_MASK | RR_PS_MASK);
- thash_purge_and_insert(v, pteval, itir , vadr);
+ thash_purge_and_insert(v, pteval, itir, vadr, ISIDE_TLB);
return IA64_NO_FAULT;
}
if(!vpsr.ic){
* Purge overlap TCs and then insert the new entry to emulate itc ops.
* Notes: Only TC entry can purge and insert.
*/
-void thash_purge_and_insert(VCPU *v, u64 pte, u64 itir, u64 ifa)
+void thash_purge_and_insert(VCPU *v, u64 pte, u64 itir, u64 ifa, int type)
{
u64 ps;//, va;
u64 phy_pte;
}
}
else {
+ u64 psr;
+ phy_pte &= ~PAGE_FLAGS_RV_MASK;
+ psr = ia64_clear_ic();
+ ia64_itc(type + 1, ifa, phy_pte, ps);
+ ia64_set_psr(psr);
+ ia64_srlz_i();
// ps < mrr.ps, this is not supported
- panic_domain(NULL, "%s: ps (%lx) < mrr.ps \n", __func__, ps);
+ // panic_domain(NULL, "%s: ps (%lx) < mrr.ps \n", __func__, ps);
}
}
else{
*
*/
extern void thash_purge_entries(struct vcpu *v, u64 va, u64 ps);
-extern void thash_purge_and_insert(struct vcpu *v, u64 pte, u64 itir, u64 ifa);
+extern void thash_purge_and_insert(struct vcpu *v, u64 pte, u64 itir, u64 ifa, int type);
/*
* Purge all TCs or VHPT entries including those in Hash table.